package com.pawernode.config;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.amqp.core.*;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * RabbitMQ配置类，用于定义交换机、队列以及绑定关系
 */
@Configuration
@ConfigurationProperties(prefix = "my")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RabbitConfig {

    private String exchangeName;
    private String queueOrderName;
    private String queuePayName;
    private String queueDlxName;

    /**
     * 创建一个直连交换机
     * @return DirectExchange类型的交换机
     */
    @Bean
    public DirectExchange directExchange() {
        return ExchangeBuilder.directExchange(exchangeName).build();
    }

    /**
     * 创建一个带有死信交换机和死信路由键的订单队列
     * @return Queue类型的订单队列
     */
    @Bean
    public Queue queueOrderNormal() {
        return QueueBuilder
                .durable(queueOrderName)
                .deadLetterExchange(exchangeName) // 设置死信交换机 ,设置相同交换机
                .deadLetterRoutingKey("error") // 设置死信路由键，要和死信交换机中的路由键保持一致
                .build();
    }

    /**
     * 将订单队列绑定到直连交换机，并指定路由键
     * @param directExchange 直连交换机
     * @param queueOrderNormal 订单队列
     * @return Binding类型的绑定关系
     */
    @Bean
    public Binding bindingOrderNormal(DirectExchange directExchange, Queue queueOrderNormal) {
        return BindingBuilder.bind(queueOrderNormal).to(directExchange).with("order");
    }

    /**
     * 创建一个带有死信交换机和死信路由键的支付队列
     * @return Queue类型的支付队列
     */
    @Bean
    public Queue queuePayNormal() {
        return QueueBuilder
                .durable(queuePayName)
                .deadLetterExchange(exchangeName) // 设置死信交换机 ,设置相同交换机
                .deadLetterRoutingKey("error") // 设置死信路由键，要和死信交换机中的路由键保持一致
                .build();
    }

    /**
     * 将支付队列绑定到直连交换机，并指定路由键
     * @param directExchange 直连交换机
     * @param queuePayNormal 支付队列
     * @return Binding类型的绑定关系
     */
    @Bean
    public Binding bindingPayNormal(DirectExchange directExchange, Queue queuePayNormal) {
        return BindingBuilder.bind(queuePayNormal).to(directExchange).with("pay");
    }

    /**
     * 创建一个持久化的死信队列
     * @return Queue类型的死信队列
     */
    @Bean
    public Queue dlxQueue() {
        return QueueBuilder.durable(queueDlxName).build();
    }

    /**
     * 将死信队列绑定到直连交换机，并指定路由键
     * @param directExchange 直连交换机
     * @param dlxQueue 死信队列
     * @return Binding类型的绑定关系
     */
    @Bean
    public Binding bindingDlx(DirectExchange directExchange, Queue dlxQueue) {
        return BindingBuilder.bind(dlxQueue).to(directExchange).with("error");
    }
}
